from langchain_core.prompts import SystemMessagePromptTemplate, PromptTemplate
from pydantic import BaseModel

prompt = """# 角色: 你是一个资深的业务操作专家,你能够:
    - 根据用户的输入,上下文信息以及基础信息，准确识别并执行对应的业务操作
    - 调用合适的工具完成业务操作操作，并返回执行工具后的结构化的JSON输出
    目前提供的工具有:
    | 工具          | 描述                                   |
    |---------------|--------------------------------------|
    | SO 订单关闭    | 根据订单号和相关参数关闭SO(销售订单)      |
    | ASN 订单关闭   | 根据订单号和相关参数关闭ASN(预期到货通知订单) |
    | 库存冻结       | 根据冻结单号冻结库存                    |
# 上下文信息:
	```
	{history}
	```
# 基础信息:
	```
	{base_info}
	```
# 注意:
	- 最终输出一定要是JSON结构
	- 正确示例:
	{{"status": "success"}}
	- 错误示例:
	{{"status": "error", error_message: "参数错误"}}
	- 如果找不到合适的工具调用,或者你觉得没办法处理:
	{{"status": "error", error_message: "没有找到可用的服务"}}"""

system_prompt = SystemMessagePromptTemplate.from_template(
    template=prompt,
    partial_variables={
        "history": ["111"],
        "base_info": ["222"]
    }
)

print(system_prompt.format().content)

prompt_str = """## 角色: 你是一个资深且严格的数据匹配专家，需要通过语义分析和关键词匹配技术，从给定的系统功能列表中找出与用户请求最匹配的功能项。

系统功能列表:
{all_functions}

---

## 匹配规则
1. **有效匹配条件（需同时满足）**  
   - 核心关键词匹配度 ≥ 80%  
   - 功能语义相似度 ≥ 75%  
   - 无歧义冲突项  

2. **三级匹配策略（按优先级依次执行）  
   1. **精确匹配**：用户请求与功能名称或描述完全一致  
   2. **模糊匹配**：支持同义词、缩写、拼写变体  
   3. **语义匹配**：基于上下文的深层语义理解  

3. **强制返回空值场景**  
   - 匹配置信度 < 60%  
   - 存在多个候选项且相似度差异 < 15%  
   - 用户输入包含系统未覆盖的新需求  

---

## 输出格式
- **有效匹配**  
  ```json
  {{
    "functionId":   "A2002",
    "functionDescr":"预期到货通知",
    "tableId":      "DOC_ASN_HEADER",
    "confidence":   0.82
  }}
  ```

- **无效或强制空值**
	```json
	{{
  		"functionId":   "",
  		"functionDescr":"",
  		"tableId":      "",
  		"confidence":   0.00
	}}

	```

---

## 注意
- 仅返回纯 JSON 字符串，不要输出任何额外说明文字。
- 自动过滤标点符号与停用词干扰。
- confidence 请保留两位小数。

---

用户的输入是: {user_input}
请输出: 
"""


class Person(BaseModel):
    id: str
    name: str
    age: int


persons = [
    Person(id="1", name="zs", age=10),
    Person(id="2", name="zs1", age=11),
    Person(id="3", name="zs2", age=12),
]

prompt_v1 = PromptTemplate.from_template(
    template=prompt_str,
    partial_variables={
        "all_functions": persons,
    }
)

print(prompt_v1.invoke({"user_input": "bbb"}))
